//请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ，验证已经填入的数字是否有效即可。 
//
// 
// 数字 1-9 在每一行只能出现一次。 
// 数字 1-9 在每一列只能出现一次。 
// 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。（请参考示例图） 
// 
//
// 
//
// 注意： 
//
// 
// 一个有效的数独（部分已被填充）不一定是可解的。 
// 只需要根据以上规则，验证已经填入的数字是否有效即可。 
// 空白格用 '.' 表示。 
// 
//
// 
//
// 示例 1： 
// 
// 
//输入：board = 
//[['5','3','.','.','7','.','.','.','.']
//,['6','.','.','1','9','5','.','.','.']
//,['.','9','8','.','.','.','.','6','.']
//,['8','.','.','.','6','.','.','.','3']
//,['4','.','.','8','.','3','.','.','1']
//,['7','.','.','.','2','.','.','.','6']
//,['.','6','.','.','.','.','2','8','.']
//,['.','.','.','4','1','9','.','.','5']
//,['.','.','.','.','8','.','.','7','9']]
//输出：true
// 
//
// 示例 2： 
//
// 
//输入：board = 
//[['8','3','.','.','7','.','.','.','.']
//,['6','.','.','1','9','5','.','.','.']
//,['.','9','8','.','.','.','.','6','.']
//,['8','.','.','.','6','.','.','.','3']
//,['4','.','.','8','.','3','.','.','1']
//,['7','.','.','.','2','.','.','.','6']
//,['.','6','.','.','.','.','2','8','.']
//,['.','.','.','4','1','9','.','.','5']
//,['.','.','.','.','8','.','.','7','9']]
//输出：false
//解释：除了第一行的第一个数字从 5 改为 8 以外，空格内其他数字均与 示例1 相同。 但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无
//效的。 
//
// 
//
// 提示： 
//
// 
// board.length == 9 
// board[i].length == 9 
// board[i][j] 是一位数字（1-9）或者 '.' 
// 
//
// Related Topics 数组 哈希表 矩阵 👍 1261 👎 0


import java.util.*;

//leetcode submit region begin(Prohibit modification and deletion)
class Solution36 {
    public boolean isValidSudoku(char[][] board) {
        Map<Integer, Set<Character>> rowMap = new HashMap<>();
        Map<Integer, Set<Character>> columnMap = new HashMap<>();
        Map<Integer, Set<Character>> aroundMap = new HashMap<>();
        initMap(rowMap, columnMap, aroundMap);

        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[i].length; j++) {
                char num = board[i][j];
                if(num == '.') {
                    continue;
                }
                if(!rowMap.get(i).add(num)) {
                    return false;
                }
                if(!columnMap.get(j).add(num)) {
                    return false;
                }
                int k = i/3*3 + j/3;
                if(!aroundMap.get(k).add(num)) {
                    return false;
                }
            }
        }

        return true;
    }

    private void initMap(Map<Integer, Set<Character>> rowMap, Map<Integer, Set<Character>> columnMap, Map<Integer, Set<Character>> aroundMap) {
        for (int i=0; i<9; i++) {
            rowMap.put(i, new HashSet<>());
            columnMap.put(i, new HashSet<>());
            aroundMap.put(i, new HashSet<>());
        }
    }


//    public static void main(String[] args) {
//        char[][] board = new char[][]
//                {{'5','3','.','.','7','.','.','.','.'},
//                 {'6','.','.','1','9','5','.','.','.'},
//                        {'.','9','8','.','.','.','.','6','.'},
//                        {'8','.','.','.','6','.','.','.','3'},
//                        {'4','.','.','8','.','3','.','.','1'},
//                        {'7','.','.','.','2','.','.','.','6'},
//                        {'.','6','.','.','.','.','2','8','.'},
//                        {'.','.','.','4','1','9','.','.','5'},
//                        {'.','.','.','.','8','.','.','7','9'}};
//        System.out.println(new Solution36().isValidSudoku(board));
//
//    }
}
//leetcode submit region end(Prohibit modification and deletion)
